package cn.com.chengmandian.core.web.pojo;

import cn.com.chengmandian.core.common.constants.ResponseCode;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;

import java.io.Serializable;

@Slf4j
@Data
@NoArgsConstructor
@ApiModel(value = "统一返还结果")
public class AjaxResult<T> implements Serializable {

    /** 状态码 */
    @ApiModelProperty("结果编码，code=200 成功，其它均为失败")
    private int code;

    /** 数据对象 */
    @ApiModelProperty("结果描述")
    private String message;

    /** 返回内容 */
    @ApiModelProperty("结果数据")
    private T data;

    /**
     * 初始化一个新创建的 AjaxResult 对象
     *
     * @param code 状态码
     * @param message 返回内容
     * @param data 数据对象
     */
    public AjaxResult(int code, String message, T data)
    {
        this.code = code;
        this.message = message;
        if (data != null) {
            this.data = data;
        }
    }

    /**
     * 是否成功
     */
    public boolean isSuccess() {
        return this.code == ResponseCode.SUCCESS;
    }

    /**
     * 返回成功消息
     *
     * @return 成功消息
     */
    public static<T> AjaxResult<T> success()
    {
        return AjaxResult.success("操作成功");
    }

    /**
     * 返回成功数据
     *
     * @return 成功消息
     */
    public static<T> AjaxResult<T> success(T data)
    {
        return AjaxResult.success("操作成功", data);
    }

    /**
     * 返回成功消息
     *
     * @param message 返回内容
     * @return 成功消息
     */
    public static<T> AjaxResult<T> success(String message)
    {
        return AjaxResult.success(message, null);
    }

    /**
     * 返回成功消息
     *
     * @param message 返回内容
     * @param data 数据对象
     * @return 成功消息
     */
    public static<T> AjaxResult<T> success(String message, T data)
    {
        return new AjaxResult<>(ResponseCode.SUCCESS, message, data);
    }

    /**
     * 返回错误消息
     */
    public static<T> AjaxResult<T> error()
    {
        return AjaxResult.error("操作失败");
    }

    /**
     * 返回错误消息
     *
     * @param message 返回内容
     * @return 警告消息
     */
    public static<T> AjaxResult<T> error(String message)
    {
        return AjaxResult.error(message, null);
    }

    /**
     * 返回错误消息
     *
     * @param message 返回内容
     * @param data 数据对象
     * @return 警告消息
     */
    public static<T> AjaxResult<T> error(String message, T data)
    {
        return new AjaxResult<>(ResponseCode.ERROR, message, data);
    }

    /**
     * 返回错误消息
     *
     * @param code 状态码
     * @param message 返回内容
     * @param data 数据对象
     * @return 警告消息
     */
    public static<T> AjaxResult<T> error(int code, String message, T data)
    {
        return new AjaxResult<>(code, message, data);
    }

    /**
     * 返回错误消息
     *
     * @param code 状态码
     * @param message 返回内容
     * @return 警告消息
     */
    public static<T> AjaxResult<T> error(int code, String message)
    {
        return new AjaxResult<>(code, message, null);
    }

    /**
     * 处理Exception
     */
    public static<T> AjaxResult<T> error(Exception e) {
        log.error("Exception", e);
        return error(ResponseCode.ERROR, e.getMessage());
    }
}
